package br.com.petrobrasrj.view;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletContext;

import br.com.petrobrasrj.model.Texto;
import br.com.petrobrasrj.session.IGenericSession;

@Named
@ConversationScoped
public class TextoManager implements Serializable{

	private static final long serialVersionUID = 7923034567569014554L;
	
	private Texto texto = new Texto();
	
	private String totalPalavras;
	private String palavrasRepetidas;
	private String palavrasNaoRepetidas;
	private String totalPalavrasNaoRepetidas;
	
	
	private File arquivo;
	
	@EJB
	private IGenericSession<Texto> textoSession;
	
	
	public String prepareSave(){
		texto = new Texto();
		return "formTexto";
	}
	
	public String save(){
//		textoSession.save(texto);
		
		System.out.println(texto.toString());
		
		return null;
	}
	
	public String prepareUpdate(){
		textoSession.findById(Texto.class, texto.getId());
		return "formTexto";
	}
	
	public String update(){
		textoSession.update(texto);
		return list();
			
	}
	
	public String delete() {

		textoSession.delete(texto);
		return list();

	}
	
	public String list(){
//		listTextoIguais = textoSession.findAll(Texto.class);
		return "listTexto";
	}

	public void escreverTextoEmArquivo() {
		try {
		
			arquivo = criarArquivo();
			escrever(arquivo, texto.getTexto());
			

		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	public int contarNumeroTotalPalavras() throws IOException{
		//verificar quando nao tiver nada escrito 
		//verificar quando o arquivo nao estiver criado
		arquivo = criarArquivo();
		StringBuffer string = ler(arquivo);
		ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
		
		if(listPalavras.size() == 1 && listPalavras.get(0).equals("")){
			listPalavras.clear();
		}
		
		System.out.println("numero total de palavras "+ listPalavras.size());
		
		setTotalPalavras(""+listPalavras.size());
		return listPalavras.size();
		
	}
	
	public void contarRepetidas(){
		try {
			arquivo = criarArquivo();
		
			StringBuffer string = ler(arquivo);
			
			ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
			
			if(listPalavras.size() == 1 && listPalavras.get(0).equals("")){
				listPalavras.clear();
			}
			
			/**
			 * Retirando as palavras para comparacao.
			 */
			Set<String> set = new HashSet<>();
			set.addAll(listPalavras);
			
			/**
			 * Map para guardar palavra e quantidade.
			 */
			HashMap<String, Integer> map = new HashMap<>();
			
			for (String palavra : set) {
				int count = 0;
				for (String palavraAux : listPalavras) {
					if(palavra.equals(palavraAux)){
						count++;
					}
				}
				if (count > 1) {
					map.put(palavra, count);
				}
			}
			
			setPalavrasRepetidas(map.toString());
			System.out.println("Repetidas " + map.toString());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	
	public void contarNaoRepetidas(){
			
		try {
			arquivo = criarArquivo();
		
			StringBuffer string = ler(arquivo);
			
			ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
			
			if(listPalavras.size() == 1 && listPalavras.get(0).equals("")){
				listPalavras.clear();
			}
			
			/**
			 * Retirando as palavras para comparacao.
			 */
			Set<String> set = new HashSet<>();
			set.addAll(listPalavras);
			
			/**
			 * Map para guardar palavra e quantidade.
			 */
			HashMap<String, Integer> map = new HashMap<>();
			int countTotal = 0;
			for (String palavra : set) {
				int count = 0;
				
				for (String palavraAux : listPalavras) {
					if (palavraAux.contains(palavra)) {
						count++;
					}
				}
				if (count == 1) {
					countTotal++;
					map.put(palavra, count);
				}
			}
			
			setPalavrasNaoRepetidas(map.toString());
			setTotalPalavrasNaoRepetidas(""+countTotal);
			
			System.out.println("Nao repetirdas " + map.toString());
			System.out.println("Total Nao repetirdas " + countTotal);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	private File criarArquivo() throws IOException {
		FacesContext context = FacesContext.getCurrentInstance();
		ServletContext sc = (ServletContext) context.getExternalContext().getContext();

		File diretorio = new File(sc.getRealPath("/arquivos"));
		if (!diretorio.isDirectory())
			diretorio.mkdir();

		File arq = new File(diretorio, "arquivo.txt");
		if (!arq.exists()) {
			arq.createNewFile();
		}

		return arq;

	}

	private void escrever(File arq, String string) {

		try {
			FileWriter fileWriter;
			fileWriter = new FileWriter(arq, true);
			PrintWriter printWriter = new PrintWriter(fileWriter, true);
			printWriter.append(string);
			printWriter.append(System.getProperty("line.separator"));
			printWriter.flush();
			printWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	
	private StringBuffer ler(File arq) throws IOException {

		BufferedReader in = new BufferedReader(new FileReader(arq));
		StringBuffer string = new StringBuffer();
		while (in.ready()) {
			string.append(in.readLine().toLowerCase());
			string.append(" ");
		}
		in.close();

		return string;
	}
	
	public Texto getTexto() {
		return texto;
	}

	public void setTexto(Texto texto) {
		this.texto = texto;
	}

	public String getTotalPalavras() {
		return totalPalavras;
	}

	public void setTotalPalavras(String totalPalavras) {
		this.totalPalavras = totalPalavras;
	}

	public String getPalavrasRepetidas() {
		return palavrasRepetidas;
	}

	public void setPalavrasRepetidas(String palavrasRepetidas) {
		this.palavrasRepetidas = palavrasRepetidas;
	}

	public String getPalavrasNaoRepetidas() {
		return palavrasNaoRepetidas;
	}

	public void setPalavrasNaoRepetidas(String palavrasNaoRepetidas) {
		this.palavrasNaoRepetidas = palavrasNaoRepetidas;
	}

	public String getTotalPalavrasNaoRepetidas() {
		return totalPalavrasNaoRepetidas;
	}

	public void setTotalPalavrasNaoRepetidas(String totalPalavrasNaoRepetidas) {
		this.totalPalavrasNaoRepetidas = totalPalavrasNaoRepetidas;
	}

	
	
}
